<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 改变this指向的方法?  
    // call   apply   bind  => 所有的函数均可以使用
    function fn(a,b) {
        console.log(this);
        console.log(a,b);
    }

    // fn.call()  fn.apply()   借鸡生蛋 => 不影响原函数
    // call(obj,arg1,arg2,...argN)   
    // (1) 调用函数
    // (2) 在此次函数执行过程中  强制将this执行call()方法的第一参数
    // (3) 如果函数需要接收参数  那么就从第二参数开始  依次传入

    fn.call(document.body,2,3);


    // apply(obj,[arg1,arg2,...argN])   
    // (1) 调用函数
    // (2) 在此次函数执行过程中  强制将this执行apply()方法的第一参数
    // (3) 如果函数需要接收参数   需要将参数依次整合到数组中  再将数组 作为第二参数传入

    fn.apply(document,[3,4]);

    // fn.bind()               授人以鱼不如授人以渔  =>    生成新函数   新函数的this改变
    // bind(obj,arg1,arg2,...argN)   
    // (1) 根据原函数生成新的函数
    // (2) 新函数执行过程中  强制将this执行bind()方法的第一参数
    // (3) 如果函数需要接收参数  
    //    a. 使用bind方法时  就从第二参数开始  依次传入
    //    b. 使用bind方法时 只规定this指向  调用时传入

    var re = fn.bind(document.body,5,6);
    re();
    var re = fn.bind(document.body);
    re(7,8)
</script>

</html>